#include <reg51.h>

// 全局滴答计数器，每1ms加1
static volatile unsigned int hal_tick = 0;

// 定时器0初始化：1ms中断一次（晶振11.0592MHz）
void hal_tick_init(void) {
    TMOD &= 0xF0;  // 清除定时器0配置
    TMOD |= 0x01;  // 方式1，16位定时器
    
    // 计算初值：1ms = 1000μs
    // 机器周期 = 12 / 11.0592MHz ≈ 1.085μs
    // 需计数次数 = 1000μs / 1.085μs ≈ 921
    // 初值 = 65536 - 921 = 64615 = 0xFC67
    TH0 = 0xFC;    
    TL0 = 0x67;
    
    ET0 = 1;       // 允许定时器0中断
    EA = 1;        // 允许总中断
    TR0 = 1;       // 启动定时器0
}

// 定时器0中断服务程序：每1ms更新一次tick
void timer0_isr(void) interrupt 1 {
    // 重装载初值
    TH0 = 0xFC;
    TL0 = 0x67;
    
    // 滴答计数器递增
    hal_tick++;
}

// 获取当前tick值
unsigned int hal_get_tick(void) {
    unsigned int tick;
    
    // 关闭中断防止读取过程中被修改
    ET0 = 0;
    tick = hal_tick;
    ET0 = 1;
    
    return tick;
}

// 延时函数：基于hal_tick的阻塞延时（ms）
void hal_delay_ms(unsigned int ms) {
    unsigned int start_tick = hal_get_tick();
    while ((hal_get_tick() - start_tick) < ms);
}

// 示例主函数
void main(void) {
    hal_tick_init();  // 初始化滴答时钟
    unsigned int tick = 0;
    while(1) {
        // 每隔1000ms执行一次操作（示例）
		if(hal_get_tick() - tick > 1000)
		{
			printf("timeout");
			tick = hal_get_tick();
		}
        //hal_delay_ms(1000);
        // 此处添加需要定时执行的代码
    }
}
